package handler

import (
	"net/http"

	"gitee.com/li-zhenyi/yi-nian-zhi-jian/backend/internal/service"
	"github.com/gin-gonic/gin"
)

// UserHandler 处理用户相关请求的控制器
// 这个结构体持有userService接口，用于调用用户业务逻辑

type UserHandler struct {
	userService service.UserService
}

// NewUserHandler 创建一个新的用户控制器实例
// 参数userService是用户服务接口，用于注入依赖
func NewUserHandler(userService service.UserService) *UserHandler {
	return &UserHandler{
		userService: userService,
	}
}

// RegisterUser 处理用户注册请求
// 这个方法接收用户提交的注册信息（用户名、密码、昵称），创建新用户并返回结果
func (h *UserHandler) RegisterUser(c *gin.Context) {
	// 定义请求体结构体，用于绑定和验证用户提交的数据
	type RegisterRequest struct {
		Username string `json:"username" binding:"required,min=3,max=50"`
		Password string `json:"password" binding:"required,min=6,max=50"`
		Nickname string `json:"nickname" binding:"required,min=2,max=50"`
	}

	// 声明请求体变量
	var req RegisterRequest
	// 绑定并验证请求数据
	if err := c.ShouldBindJSON(&req); err != nil {
		// 如果验证失败，返回400错误
		c.JSON(http.StatusBadRequest, gin.H{
			"code": 400,
			"message": "参数验证失败",
			"error": err.Error(),
		})
		return
	}

	// 调用Service层处理注册业务逻辑
	user, err := h.userService.Register(req.Username, req.Password, req.Nickname)
	if err != nil {
		// 如果注册失败，返回错误信息
		c.JSON(http.StatusBadRequest, gin.H{
			"code": 400,
			"message": err.Error(),
		})
		return
	}

	// 返回成功响应
	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"message": "注册成功",
		"data": gin.H{
			"id": user.ID,
			"username": user.Username,
			"nickname": user.Nickname,
			"avatar": user.Avatar,
		},
	})
}

// LoginUser 处理用户登录请求
// 这个方法接收用户提交的登录信息（用户名、密码），验证凭据并返回登录结果
func (h *UserHandler) LoginUser(c *gin.Context) {
	// 定义请求体结构体
	type LoginRequest struct {
		Username string `json:"username" binding:"required"`
		Password string `json:"password" binding:"required"`
	}

	var req LoginRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code": 400,
			"message": "参数验证失败",
			"error": err.Error(),
		})
		return
	}

	// 调用Service层处理登录业务逻辑
	user, token, err := h.userService.Login(req.Username, req.Password)
	if err != nil {
		c.JSON(http.StatusUnauthorized, gin.H{
			"code": 401,
			"message": err.Error(),
		})
		return
	}

	// 返回成功响应
	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"message": "登录成功",
		"data": gin.H{
			"id": user.ID,
			"username": user.Username,
			"nickname": user.Nickname,
			"avatar": user.Avatar,
			"token": token,
		},
	})
}

// GetUserInfo 处理获取用户信息请求
// 这个方法根据用户的身份，返回用户的详细信息
func (h *UserHandler) GetUserInfo(c *gin.Context) {
	// TODO: 在实际项目中，这里应该从JWT令牌中获取用户ID
	// 为了演示，我们假设用户ID为1
	userId := int64(1)

	// 调用Service层查询用户信息
	user, err := h.userService.GetUserInfo(userId)
	if err != nil {
		c.JSON(http.StatusNotFound, gin.H{
			"code": 404,
			"message": err.Error(),
		})
		return
	}

	// 返回用户信息
	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"message": "success",
		"data": user,
	})
}